;Exercise 1.9.  Each of the following two procedures defines
;a method for adding two positive integers in terms of the
;procedures inc, which increments its argument by 1, and dec, which decrements its argument by 1.


(define (+ a b)
  (if (= a 0)
      b
      (inc (+ (dec a) b))))

;(+ 4 5)
;(inc (+ 3 5))
;(inc (inc (+ 2 5)))
;(inc (inc (inc (+ 1 5))))
;(inc (inc (inc (inc (+ 0 5)))
;(inc (inc (inc (inc 5)))))
;(inc (inc (inc (6))))
;(inc (inc 7))
;(inc 8)
;(9)

(define (+ a b)
  (if (= a 0)
      b
      (+ (dec a) (inc b))))

;(+ 3 6)
;(+ 2 7)
;(+ 1 8)
;(+ 0 9)
;(9)


;The first process is recursive. Note the linear recursion pattern of
;expansion and contraction of function calls in the stack and how
;the expansion halts when the recursion's base is reached (= a 0)

;The second process is iterative. State is manually tracked after each call to + The procedure itself is tail recursive, being handled by the interpreter as an iteractive call through TCO (Tail Call Optimization)

;Personal Note: Remembered of reading something related on Lambda The Ultimate have once about this lack of feature in most mainstream programming languages(java , for instance)
